今天當我們架了各式各樣的服務,但只要是服務就有機會會壞掉,這時候就會需要有health check以及auto heal的功能來檢查以及復原壞掉的服務,在這邊介紹他的運作機制以及部分限制,如果有需要這項服務的就可以自己加上去
以下是等等做實驗的範例docker-compose.yaml
services:
docker-autoheal:
image: willfarrell/autoheal:latest
container_name: docker-autoheal
restart: always
environment:
AUTOHEAL_CONTAINER_LABEL: all
volumes:
- /var/run/docker.sock:/var/run/docker.sock
learn-devops-backend:
image: ghcr.io/kevinyay945/learn-devops-backend:v0.0.11
container_name: learn-devops-backend
restart: unless-stopped
ports:
- "5000:5000"
labels:
autoheal: "true"
healthcheck:
test: ["CMD-SHELL", "/backend health || exit 1"]
interval: 30s
timeout: 5s
retries: 3
start_period: 30s
在上述的實驗中我放了兩個service
這個服務會去查看labels有放上 autoheal=true
的container的服務狀態,當他看到是unhealth時,就會自動將container重新啟動
learn-devops-backend
中,他有提供兩個endpoint
[POST] /health/liveness/toggle
[GET] /health/liveness
第一個他可以自由的切換liveness的狀態,第二個可以用來判斷服務是否還活著
而我們要讓服務可以順利切換health跟unhealth,就需要使用docker提供的health check的功能,文件如下
https://docs.docker.com/reference/dockerfile/#healthcheck
而這個服務會在service啟動後,透過定期去執行你所定義的的指令,判斷這個指令是否執行成功(回傳的狀態碼是否為0),如果超過重試的次數,就會將狀態切換成unhealth
而這個功能要注意一個點,因為他運行的環境就是你實際服務的container,所以如果你的container裡面沒有先安裝好一些工具(例如curl),就要換個測試health check的方法,我這邊是直接多設計一個啟動的command,讓他可以去打我提供的health check的http endpoint
docker compose up -d
docker ps
curl -X 'POST' 'http://localhost:5000/health/liveness/toggle' -H 'accept: application/json'
docker ps
的狀態上述實驗做完,可以試著將authheal的服務關掉,再讓原本的backend死掉,看看會不會有重啟的狀況發生